package com.反射Reflection.Reflection___;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.Instant;

public class reflection的优缺点 {
    /**
     * 优点：
     * 1.可以动态的创建和使用对象（框架的核心） ， 使用灵活。没有反射机制框架技术就失去底层支撑
     *
     * 缺点：
     * 1.使用反射基本是解释执行，执行速度会有影响，变慢
     * 优化方法，用setAccessible(true) 关闭访问检查，构造器，方法，变量都有这个方法
     */
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

        ///  执行速度对比
        /// 传统方法比反射快
        long start = System.currentTimeMillis();
        reflection的优缺点 r1 = new reflection的优缺点();
        for (int i = 0; i < 90000000; i++) {
            r1.hi();
        }
        long stop = System.currentTimeMillis();
        System.out.println("传统方法耗时 = "+(stop - start));


        /// 反射来常见对象并调用方法 会比传统方法慢
        String str = "com.反射Reflection.Reflection___.reflection的优缺点";
        start = System.currentTimeMillis();
        Class<?> cls = Class.forName(str);
        Object ww = cls.newInstance();
        Method hi = cls.getMethod("hi");
        for (int i = 0; i < 90000000; i++) {
            hi.invoke(ww); 
        }
        stop = System.currentTimeMillis();
        System.out.println("反射方法耗时 = "+(stop - start));


        /// 反射速度优化  关闭访问检查开关 setAccessible(boolean)  如果Boolean是true，关闭访问检查，反之打开安全检查
        hi.setAccessible(true); ///关闭访问检查
        start = System.currentTimeMillis();
        for (int i = 0; i < 90000000; i++) {
            hi.invoke(ww);
        }
        stop = System.currentTimeMillis();
        System.out.println("优化后 反射方法耗时 = "+(stop - start));

        /**循环调用9千万次同一个方法，反射比传统方法很慢，优化后有一点点的加快
         * 传统方法耗时 = 4
         * 反射方法耗时 = 600
         * 优化后 反射方法耗时 = 525
         */

    }



    public void hi(){

    }
}
